package com.operator.Activitys.activity;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.method.LinkMovementMethod;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.flyco.tablayout.SlidingTabLayout;
import com.flyco.tablayout.listener.OnTabSelectListener;
import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.adapter.FragmentAdapter;
import com.operator.Activitys.adapter.SaleAdapter;
import com.operator.Activitys.bean.Sale;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.fragment.SaleMobileFragment;
import com.operator.Activitys.fragment.SaleOtherFragment;
import com.operator.Activitys.fragment.SaleTelecomFragment;
import com.operator.Activitys.fragment.SaleUnicomFragment;
import com.operator.Activitys.http.manager.HomeManager;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.StringUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.zhy.autolayout.AutoLinearLayout;

import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;

/**
 * 项目名称：金泽云 手机app
 * 类描述：号卡销售
 * 创建人：张飞祥
 * 创建时间：2018/5/3 9:24
 * 修改人：张飞祥
 * 修改时间：2018/5/3 9:24
 * 修改备注：
 */
public class SaleActivity extends BaseActivity implements OnTabSelectListener, ViewPager.OnPageChangeListener {


    /**
     * View
     */
    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;

    //TODO 联动视图
    //号卡详情
    private TextView tvSaleDetails;
    //滑块视图
    private SlidingTabLayout tabSaleLayout;
    //滑动视图
    private ViewPager vpSaleSlide;

    //TODO 有数据显示视图
    //上拉加载视图
    SmartRefreshLayout layoutRefresh;
    //列表视图
    RecyclerView rvList;

    //TODO 无数据显示视图
    //圆圈 img
    ImageView ivLoad;
    //加载布局
    AutoLinearLayout layoutLoad;
    //刷新文字
    TextView tvPush;
    //刷新布局
    AutoLinearLayout layoutPush;
    //外层预加载视图
    RelativeLayout layoutNoData;


    /**
     * 变量
     */
    //初始化网络请求
    public HomeManager mApiManager;

    //TODO 滑块标题
    private String[] mTitles = {"联通", "电信", "移动", "170"};
    //fragment 集合
    private List<Fragment> fragments = new ArrayList<>();
    //fragment 适配器
    private FragmentAdapter fragmentAdapter;
    //号卡标志位
    private int mSalePos = 0;

    //TODO RecyclerView 变量
    //号卡销售 adapter
    private SaleAdapter mAdapter = null;
    //号卡销售 list
    private List<Sale> mSaleList = null;

    //TODO http 变量
    //请求哪一页
    private int mIndex = 1;
    //每页几条
    private int mPageCount = 10;
    //上拉加载 没有数据 page 是否 +1
    private boolean mPullPageFlag = true;
    //网络请求 true：错误 ，false 为空
    public boolean mHttpErrorFlag;
    //号码类型标记  0.公有号码、1.私有号码（默认 "公有号码" ）
    private String mNumberType = "0";

    //TODO 向下传递 参数
    //套餐 标题
    private String mSetMealTitle = "";
    //套餐 价格
    private String mSetMealPrice = "";
    //卡号
    private String mPhoneNumber = "";
    //价钱
    private double mPrice;

    //TODO 当前 内存中 用户信息
    private User mACacheUser = null;


    @Override
    protected void initUI() {
        setContentView(R.layout.act_sale);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getHomeApiManager(this,this.getTaskId());

        //TODO 初始化控件
        initViews();

        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //设置标题
        tvTitle.setText("号卡销售");

        //TODO 禁止下拉加载
        layoutRefresh.setEnableRefresh(false);

        //TODO 获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
    }

    @Override
    protected void initData() {

        //TODO 开始网络请求 获取卡号列表
        initSaleHttp();
        //TODO 上拉加载
        initLoadMoreListener();

        //设置  TextView 文本可滑动
        tvSaleDetails.setMovementMethod(ScrollingMovementMethod.getInstance());
        //adapter 加载 fragment 具体 操作
        initAddFragmentToViewPager();
    }


    /**
     * 初始化 适配器数据
     */
    private void initAddFragmentToViewPager() {

        //添加 Fragment 到数组集合
        fragments.add(new SaleUnicomFragment());       //联通
        fragments.add(new SaleTelecomFragment());      //电信
        fragments.add(new SaleMobileFragment());       //移动
        fragments.add(new SaleOtherFragment());        //170

        //fragment 适配器
        fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), fragments);
        // 配置适配器
        vpSaleSlide.setAdapter(fragmentAdapter);
        //装填 viewPager 适配器
        tabSaleLayout.setViewPager(vpSaleSlide,mTitles);

        //滑动事件监听
        vpSaleSlide.setOnPageChangeListener(this);
        //滑块监听事件
        tabSaleLayout.setOnTabSelectListener(this);
    }

    /**
     * 按钮点击事件
     * @return
     */
    @OnClick({R.id.iv_return,R.id.btn_sale_submit})
    public void onClick(View view){
        switch (view.getId()){
            case R.id.iv_return:        //返回按钮
                finish();
                break;
            case R.id.btn_sale_submit:  //确认按钮
                /**
                 * 逻辑判断
                 * 1.判断 当前店铺是否已经认证
                 * 2.判断 当前店铺是否给冻结了
                 * 3.都不是的情况下 进行原来的 数据操作
                 *
                 */
                if (Constant.SHOP_CONFIRM_YES.equals(mACacheUser.getIsCertified())) {

                    if (Constant.SHOP_STATE_YES.equals(mACacheUser.getState())) {
                        if (!mPhoneNumber.equals(""))
                            setOnClickSaleSubmit();
                        else
                            ToastUtils.showShort(SaleActivity.this,"请选择心仪的号卡！");
                    }else {
                        ToastUtils.showShort(SaleActivity.this, getResources().getString(R.string.shop_state_no));
                    }
                }else{
                    ToastUtils.showShort(SaleActivity.this, getResources().getString(R.string.shop_confirm_no));
                }
                break;
        }
    }

    /**
     * 确认按钮 点击事件
     */
    private void setOnClickSaleSubmit(){
        //TODO  向下传递 TAG
        Bundle bundle = new Bundle();
        //开卡标记
        bundle.putInt(Constant.INTENT_SALE_TAG,mSalePos);
        //套餐标题
        bundle.putString(Constant.INTENT_SALE_TITLE,mSetMealTitle);
        //手机号码
        bundle.putString(Constant.INTENT_SALE_PHONE_NUMBER,mPhoneNumber);

        //TODO 价格
        //设置总价格 （套餐 + 手机号）
        double price = mPrice +  Double.parseDouble(mSetMealPrice);
        //手机号卡 价格
        bundle.putDouble(Constant.INTENT_SALE_PRICE,price);

        //TODO  跳转业务逻辑 判断
        if (mSalePos == 0 || mSalePos == 3)
            JumperUtils.JumpTo(this,UnicomCardActivity.class,bundle);
        else
            JumperUtils.JumpTo(this,TelecomCardActivity.class,bundle);
    }

    /**
     * http 号卡列表 网络请求
     */
    private void initSaleHttp(){
        //清空列表
        if (mSaleList != null && mSaleList.size() > 0)
            mSaleList.clear();
        //清空adapter
        if (mAdapter != null)
            mAdapter.clearDataAll();

        //初始化全局 list
        mSaleList = new ArrayList<>();

        //设置 为 首次加载
        mApiManager.getType(Constant.FIRST_LOAD);
        //初始化 上拉加载  page 允许 +1
        mPullPageFlag = true;
        //初始化页数
        mIndex = 1;

        //显示无数据 刷新加载页面
        initShowViewLoading(true);
        //开始网络请求
        mApiManager.homeSaleList(mTitles[mSalePos],mACacheUser.getId(),mNumberType,mIndex,mPageCount);
    }

    /**
     * 上拉加载数据
     */
    private void initLoadMoreListener() {

        layoutRefresh.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(RefreshLayout refreshlayout) {
                //设置文字上拉加载更多
                mApiManager.getType(Constant.PULLUP_LOAD_MORE);
                //如果 为 true 可以 查看下一页
                if (mPullPageFlag) {
                    //数据请求
                    mIndex = mIndex + 1;
                }
                //TODO 上拉加载化网络请求
                mApiManager.homeSaleList(mTitles[mSalePos],mACacheUser.getId(),mNumberType,mIndex,mPageCount);
            }
        });
    }

    /**
     * 无数据页面
     */
    public void initShowViewLoading(boolean loadFlag) {
        //重新加载初始化视图
        initViews();
        //最外层无数据页面 显示
        layoutNoData.setVisibility(View.VISIBLE);
        //号卡列表 数据展示页面 隐藏
        layoutRefresh.setVisibility(View.GONE);
        /**
         * 动态判断 显示 当前 是重新加载页面，还是 圆圈页面
         *
         * true： 圆圈页面
         * false：重新加载页面
         */
        if (loadFlag) {
            initShowLoadRotate();
        }else{

            //隐藏圆圈页面
            layoutLoad.setVisibility(View.GONE);
            //显示重新加载页面
            layoutPush.setVisibility(View.VISIBLE);

            /**
             * 动态判断 当前 是网络 问题？ 还是 数据为空，显示不同的字段 与操作
             */
            if (mHttpErrorFlag){
                //TODO 设置重新加载文字，重新加载网络请求
                String pushStr = "重新加载";
                //给文字添加下划线，并且添加点击事件
                tvPush.setText(StringUtils.setString(pushStr, 0, pushStr.length(),
                        new ForegroundColorSpan(Color.parseColor("#808080")), new ClickableSpan() {
                            @Override
                            public void onClick(View view) {
                                //开始网络请求
                                initSaleHttp();
                                //显示圆圈加载页面
                                initShowLoadRotate();
                            }
                        }));
                tvPush.setMovementMethod(LinkMovementMethod.getInstance());
            }else{
                tvPush.setText("暂无数据");
            }
        }
    }

    /**
     * 转圈 动画布局显示
     */
    public void initShowLoadRotate(){
        /**
         * 开始倒计时
         */
        //显示圆圈页面
        layoutLoad.setVisibility(View.VISIBLE);
        //隐藏重新加载页面
        layoutPush.setVisibility(View.GONE);
        /**
         * 设置圆圈动画
         */
        Animation circle_anim = AnimationUtils.loadAnimation(this, R.anim.load_public_rotate);
        LinearInterpolator interpolator = new LinearInterpolator();  //设置匀速旋转，在xml文件中设置会出现卡顿
        circle_anim.setInterpolator(interpolator);
        if (circle_anim != null) {
            ivLoad.startAnimation(circle_anim);  //开始动画
        }
    }

    /**
     * 有数据数据页面
     */
    public void initShowViewData() {
        //重新加载初始化视图
        initViews();
        //号卡列表 显示
        layoutRefresh.setVisibility(View.VISIBLE);
        //最外层无数据页面 隐藏
        layoutNoData.setVisibility(View.GONE);
    }


    /**
     * TabLayout 滑块 数据监听事件
     * @param position
     */
    @Override
    public void onTabSelect(int position) {
        //设置 与 viewPager 联动
        vpSaleSlide.setCurrentItem(position);
    }
    @Override
    public void onTabReselect(int position) {
    }

    /**
     * ViewPager 滑动事件
     * @param position
     * @param positionOffset
     * @param positionOffsetPixels
     */
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }
    @Override
    public void onPageSelected(int position) {

        switch (position){
            case 0:
                //获取 联通 Fragment
                SaleUnicomFragment unicomFrg = (SaleUnicomFragment) fragments.get(0);
                //设置套餐详情
                tvSaleDetails.setText(unicomFrg.getSetMealDetails());
                //设置套餐标题
                mSetMealTitle = unicomFrg.getSetMealTitle();
                //设置套餐价格
                mSetMealPrice = unicomFrg.getSetMealPrice();
                //设置号码类型
                mNumberType = unicomFrg.getNumberType();
                //初始化 手机号
                mPhoneNumber = "";
                //初始化 手机号价钱
                mPrice = 0;
                break;
            case 1:
                //获取 电信 Fragment
                SaleTelecomFragment telecomFrg = (SaleTelecomFragment) fragments.get(1);
                //设置套餐详情
                tvSaleDetails.setText(telecomFrg.getSetMealDetails());
                //设置套餐标题
                mSetMealTitle = telecomFrg.getSetMealTitle();
                //设置套餐价格
                mSetMealPrice = telecomFrg.getSetMealPrice();
                //设置号码类型
                mNumberType = telecomFrg.getNumberType();
                //初始化 手机号
                mPhoneNumber = "";
                //初始化 手机号价钱
                mPrice = 0;
                break;
            case 2:
                //获取 移动 Fragment
                SaleMobileFragment mobileFrg = (SaleMobileFragment) fragments.get(2);
                //设置套餐详情
                tvSaleDetails.setText(mobileFrg.getSetMealDetails());
                //设置套餐标题
                mSetMealTitle = mobileFrg.getSetMealTitle();
                //设置套餐价格
                mSetMealPrice = mobileFrg.getSetMealPrice();
                //设置号码类型
                mNumberType = mobileFrg.getNumberType();
                //初始化 手机号
                mPhoneNumber = "";
                //初始化 手机号价钱
                mPrice = 0;
                break;
            default:
                //获取 170 Fragment
                SaleOtherFragment otherFrg = (SaleOtherFragment) fragments.get(3);
                //设置套餐详情
                tvSaleDetails.setText(otherFrg.getSetMealDetails());
                //设置套餐标题
                mSetMealTitle = otherFrg.getSetMealTitle();
                //设置套餐价格
                mSetMealPrice = otherFrg.getSetMealPrice();
                //设置号码类型
                mNumberType = otherFrg.getNumberType();
                //初始化 手机号
                mPhoneNumber = "";
                //初始化 手机号价钱
                mPrice = 0;
                break;
        }
        //设置 与 TabLayout 联动
        tabSaleLayout.setCurrentTab(position);
        //设置 卡号标志位
        mSalePos = position;
        //开始网络请求
        initSaleHttp();
    }
    @Override
    public void onPageScrollStateChanged(int state) {
    }


    /**
     * 获取 刷新页面通知
     */
    @Subscriber(tag = Constant.BUS_SALE_PUSH_UI)
    public void onSalePushUI(final String push) {
        //刷新数据
        initSaleHttp();
    }

    /**
     * 极光推送 店铺 冻结结果
     */
    @Subscriber(tag = Constant.BUS_JPUSH_SHOP_FROZEN_TAG)
    public void onJpushShopFrozenTag(String pushTag) {
        mACacheUser.setState(pushTag);
    }

    /**
     * -------------------------------------------  动态选择套餐  ----------------------------------------------
     */
    /**
     * 获取 当前 联通号卡 选中套餐详情
     *
     * saleStr[0]：运营商
     * saleStr[1]：套餐详情
     * saleStr[2]：套餐标题
     * saleStr[3]：套餐价格
     *
     */
    @Subscriber(tag = Constant.BUS_SALE_ITEM_DETAILS)
    public void onSaleItemDetails(String[] saleStr) {
        if (mTitles[mSalePos].equals(saleStr[0]))
            //设置详情
            tvSaleDetails.setText(saleStr[1]);
            //设置套餐标题
            mSetMealTitle = saleStr[2];
            //设置套餐价格
            mSetMealPrice = saleStr[3];
    }

    /**
     * -------------------------------------------  动态选择 号码类型  ----------------------------------------------
     */
    /**
     * 获取 当前 联通号卡 号码类型
     *
     * type[0]：运营商
     * type[1]：号码类型 （0：公有 1：私有）
     *
     */
    @Subscriber(tag = Constant.BUS_SALE_NUMBER_TYPE)
    public void onSaleNumberType(String[] type) {
        if (mTitles[mSalePos].equals(type[0])){
            //设置号码类型
            mNumberType = type[1];
            //开始网络请求
            initSaleHttp();
            //初始化 手机号
            mPhoneNumber = "";
            //初始化 手机号价钱
            mPrice = 0;
        }
    }

    /**
     * -------------------------------------------  http 一些 数据 返回 相关操作  -------------------------------------------
     */
    /**
     * 号卡列表 报错
     */
    @Subscriber(tag = Constant.BUS_HOME_SALE_LIST_ERROR, mode = ThreadMode.MAIN)
    public void initSaleListError(String httpCommentError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //TODO View 非空判断
                if (layoutRefresh != null) {
                    //当前是 网络请求 出错
                    mHttpErrorFlag = true;
                    //结束加载
                    layoutRefresh.finishLoadMore(false);
                    //显示无数据 重新加载页面
                    initShowViewLoading(false);
                    //弹出提示
                    ToastUtils.showShort(SaleActivity.this, "加载数据失败！");
                }
            }
        }, 3000);
    }


    /**
     * 号卡列表 首次列表数据加载
     */
    @Subscriber(tag = Constant.BUS_HOME_SALE_LIST, mode = ThreadMode.MAIN)
    public void initSaleList(final List<Sale> list) {

        //开启延时操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                //TODO View 非空判断
                if (rvList != null) {
                    if (list != null && list.size() != 0) {
                        //显示 数据列表 布局
                        initShowViewData();
                        //设置 全局"号卡列表"变量 数据
                        mSaleList.addAll(list);

                        //设置 号卡列表 适配器
                        mAdapter = new SaleAdapter(SaleActivity.this, list) {
                            @Override
                            public void setPhoneNumberPos(int position) {
                                //设置 相应号码
                                mPhoneNumber = list.get(position).getTelNum();
                                //设置 相应号码价钱
                                mPrice = Double.parseDouble(list.get(position).getPrice());
                            }
                        };

                        //TODO 设置适配器 样式 为 “网格”
                        GridLayoutManager mGridLayout = new GridLayoutManager(SaleActivity.this, 2);
                        //添加 适配器 样式
                        rvList.setLayoutManager(mGridLayout);
                        //添加 适配器
                        rvList.setAdapter(mAdapter);
                    } else {
                        //当前是 数据错误
                        mHttpErrorFlag = false;
                        //显示无数据 重新加载页面
                        initShowViewLoading(false);
                    }
                }
            }
        }, 1000);
    }

    /**
     * 号卡列表 上拉加载数据
     */
    @Subscriber(tag = Constant.BUS_HOME_SALE_LIST_FOOT)
    public void initSaleListFoot(List<Sale> list) {
        final List<Sale> footList = list;

        //开启延时操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                //TODO View 非空判断
                if (layoutRefresh != null) {
                    /**
                     * 判断是否有数据
                     * 当 返回列表 数据 size 0 没有更多数据可加载了
                     */
                    if (footList.size() == 0) {
                        //page 不允许 + 1
                        mPullPageFlag = false;
                        //显示提示
                        ToastUtils.showShort(SaleActivity.this, "没有更多数据了");
                    } else {
                        //page 允许 + 1
                        mPullPageFlag = true;
                        //填充上拉加载数据，加载到adapter里面
                        if (mAdapter != null) {
                            mAdapter.addFooterItem(footList);
                            mSaleList.addAll(footList);
                        }
                        ToastUtils.showShort(SaleActivity.this, "更新了 " + footList.size() + " 条目数据");
                    }
                    //结束加载
                    layoutRefresh.finishLoadMore();
                }
            }
        }, 1000);
    }

    /**
     * 初始化 view 视图
     */
    private void initViews() {

        /**
         * 联动视图
         */
        //初始化 滑动视图
        vpSaleSlide = findViewById(R.id.vp_sale_slide);
        //初始化 滑块视图
        tabSaleLayout = findViewById(R.id.tab_sale_layout);
        //初始化 号卡详情
        tvSaleDetails = findViewById(R.id.tv_sale_details);

        /**
         * 数据预加载页面
         */
        //圆圈 img
        ivLoad = (ImageView) findViewById(R.id.iv_load);
        //加载布局
        layoutLoad = (AutoLinearLayout) findViewById(R.id.layout_load);
        //刷新文字
        tvPush = (TextView) findViewById(R.id.tv_push);
        //刷新布局
        layoutPush = (AutoLinearLayout) findViewById(R.id.layout_push);
        //外层预加载视图
        layoutNoData = (RelativeLayout) findViewById(R.id.layout_no_data);

        /**
         * 有数据展示页面
         */
        //加载视图
        layoutRefresh = (SmartRefreshLayout) findViewById(R.id.layout_refresh);
        //列表视图
        rvList = (RecyclerView) findViewById(R.id.rv_list);
    }
}
